const Topic = require('../models/topics')
const User = require('../models/users')
const Question = require('../models/questions')
class TopicsCtl {
  // 检查话题存在与否
  async checkTopicExist (ctx, next) {
    const topic = await Topic.findById(ctx.params.id)
    if (!topic) { ctx.throw(404, '话题不存在！') }
    await next()
  }
  // 查询话题列表
  async find(ctx) {
    const { per_page = 10 } = ctx.query;
    const page = Math.max(ctx.query.page * 1, 1) -1
    const perPage = Math.max(per_page * 1, 1)
    // mongoose 通过 limit()限制数据 和 skip()略过多少数据 实现分页
    // 正则匹配实现模糊搜索 { name: new RefExp(ctx.query.q) }
    ctx.body = await Topic
      .find({ name: new RegExp(ctx.query.q) })
      .limit(perPage)
      .skip(page * perPage)
  }
  // 查询特定话题
  async findById(ctx) {
    const { fields='' } = ctx.query;
    const selectFields = fields.split(';').filter(f => f).map(f => ' +'+f).join('')
    const topic = await Topic.findById(ctx.params.id).select(selectFields)
    ctx.body = topic
  }
  // 创建话题
  async create(ctx) {
    // 校验参数
    ctx.verifyParams({
      name: { type: 'string', required: true },
      avatar_url: { type: 'string', required: false },
      introduction: { type: 'string', required: false }
    })
    const topic = await new Topic(ctx.request.body).save()
    ctx.body = topic;
  }
  // 更新话题
  async update(ctx) {
    // 校验参数
    ctx.verifyParams({
      name: { type: 'string', required: false },
      avatar_url: { type: 'string', required: false },
      introduction: { type: 'string', required: false }
    })
    const topic = await Topic.findByIdAndUpdate(ctx.params.id, ctx.request.body)
    ctx.body = topic
  }
  // 获取话题的关注者(粉丝)
  async listTopicsFollowers(ctx) {
    const users = await User.find({ followingTopics: ctx.params.id })
    ctx.body = users;
  }
  // 获取话题的问题列表
  async listQuestions(ctx) {
    const questions = await Question.find({ topics: ctx.params.id })
    ctx.body = questions
  }
}

module.exports = new TopicsCtl()